# -*- coding：utf-8 -*-
"""
@Time:2024-08-1810:04
@Auth:泛彼泊舟
@File:2、装饰器的基本使用和定义.py
@IDE:PyCharm
@模块功能：xxx
"""
"""
装饰器的定义：
- 在不修改原来函数代码的情况下增加额外的功能，就可以使用装饰器来完成操作
- 为需要被修饰的函数添加新的功能或者显示条件以及帮助输出等
- 核心：在不修改原来函数的代码情况下，给原来的函数添加性能或者限制条件

装饰器的类型：函数的装饰器、类的装饰器、方法装饰器
不管是哪一种装饰器都要遵循一个原则：
- 开放封闭原则
- 对外开放扩展，对内封闭修改

装饰器的构造：
- 装饰器本身就是一个函数
- 装饰器的返回值一定是一个函数的引用
- 装饰器有且只有一个固定的形参
- 装饰器的固定一个形参用来接收被装饰的那个函数
- 装饰器的本质就是闭包
    - 内部函数使用外部函数的变量
    - 外部函数返回内部函数的引用
"""
# 装饰器的基本使用和定义
# 用户进行账号的注册
# 原来函数定义的功能没有对账号进行验证，现在需要增加额外的功能验证账号长度符合6-12位

def username():
    print(f"您输入的账号为：dshfsfsf")

# 定义一个装饰器来完成账号长度的验证
def check(func):  # func接收被装饰的函数引用  ：func = username
    def inner():
        print("现在开始验证账号长度")
        func()  # 调用传递的函数

    return inner

username = check(username)
username()
# username("dshfsfsf")

"""
案例：去购物，没有登录之前无法进行将商品添加到购物车
正常购物流程需要先登录后添加商品到购物车，目前没有登录直接添加
添加登录功能之后再后屋
"""
def shopping():
    print("添加一辆小米su7购物车")

def check1(func):
    def inner1():
        print("开始进入登录页面")
        print("开始输入账户密码")
        print("验证账号密码中。。。")
        print("登陆成功")
        print("可以进行正常购物")
        func()

    return inner1

# 常规装饰器的调用语法格式
shopping1 = check1(shopping)
shopping1()

